
#include "precompiled.h"
#include <config/configfile.h>
#include "configstack.h"
#include <QPointer>


class ConfigFileReadOnly : public Opl::Core::ConfigFile
{
public:
	ConfigFileReadOnly(const QString& filename)
		:ConfigFile(filename){}

	bool save(){ return true; }
	void setValue(const QString&, const QString&, const QVariant&){}
};

class ConfigStackPrivate{

public:

	ConfigStackPrivate()
	{

	}

	~ConfigStackPrivate()
	{
		foreach(Opl::Core::IConfig* c, configs){
			delete c;
		}
	}


	QList<Opl::Core::IConfig*> configs;

};

ConfigStack::ConfigStack()
	:O_PRIVATE_CREATE(ConfigStack)
{

}

ConfigStack::~ConfigStack()
{
	O_PRIVATE_DELETE;
}

void ConfigStack::addFile(const QString& filename, bool readonly)
{
	O_D(ConfigStack);
	IConfig * c;

	if (readonly){
		c = new ConfigFileReadOnly(filename);
	}else{
		c = new Opl::Core::ConfigFile(filename);
	}

	c->load();
	d->configs.append(c);
}

bool ConfigStack::load()
{
	O_D(ConfigStack);
//	addFile("optra.cfg", true);
	addFile("user.cfg", false);
	return true;
}

bool ConfigStack::save()
{
	O_D(ConfigStack);
	bool b = true;
	foreach(IConfig* c, d->configs){
		b = b && c->save();
	}

	return b; 
}

QVariant ConfigStack::value(const QString& section, const QString& key, const QVariant& def/* = QVariant()*/)
{
	O_D(ConfigStack);
	foreach(IConfig* c, d->configs){
		QVariant v = c->value(section, key, def);
		if (v != def){
			return v;
		}
	}

	return def;
}

QVariantList ConfigStack::values(const QString& path)
{
//	O_D(ConfigStack);
//	foreach(IConfig* c, d->configs){
//		QVariantList v = c->values(path);
//		if (!v.isEmpty()){
//			return v;
//		}
//	}

	return QVariantList();
}

QVariant ConfigStack::value(const QString& path, const QVariant& def/* = QVariant()*/)
{
	O_D(ConfigStack);
	foreach(IConfig* c, d->configs){
		QVariant v = c->value(path, def);
		if (v != def){
			return v;
		}
	}

	return def;
}


void ConfigStack::setValue(const QString& section, const QString& key, const QVariant& val)
{
	O_D(ConfigStack);
	foreach(IConfig* c, d->configs){
		c->setValue(section, key, val);
	}
}

ConfigStack* ConfigStack::config()
{
    static QScopedPointer<ConfigStack> cfg;

    if (cfg.isNull()){
        cfg.reset(new ConfigStack());
    }

    return cfg.data();
}



